#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char **argv) {

	if (argc < 3) {
		fprintf(stderr, "Usage %s <string:arg> [string:file]\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	char * termo = argv[1];
	int numeroProgramas = argc - 2; // 1º e 2º args sao o nome do programa e o termo a pesquisar

	int * pipesLeitura[numeroProgramas];
	int resultados[numeroProgramas];
	int i = 0;

	for (i = 0; i < numeroProgramas; i++) {
		int * fdreceive = (int *) malloc(sizeof(int) * 2);
		// printf("Pipes Antes: %d %d, %d \n", i, fdreceive[0], fdreceive[1]);
		int result = pipe(fdreceive);
		// printf("Pipes Depois: %d %d, %d \n", i, fdreceive[0], fdreceive[1]);
		if (result == -1) {
			perror("pipe");
			exit(EXIT_FAILURE);
		}
		pipesLeitura[i] = fdreceive;
	}

//	for (i = 0; i < numeroProgramas; i++) {
//		printf("pipesLeitura depois: %d %d, %d \n", i, pipesLeitura[i][0],
//				pipesLeitura[i][1]);
//	}


	for (i = 0; i < numeroProgramas; i++) {
		int pid = fork();
		switch (pid) {
		case -1:
			perror("fork");
			exit(EXIT_FAILURE);
			break;
		case 0: {
			int fd = open(argv[i + 2], O_RDONLY); // open read only
			if (fd == -1) {
				perror("open");
				exit(EXIT_FAILURE);
			}

			close(pipesLeitura[i][0]); // se o pai lê, não lê o fio

			dup2(fd, STDIN_FILENO);
			dup2(pipesLeitura[i][1], STDOUT_FILENO);

			execl("oc.exe", "ox.exe", argv[1], NULL);
			perror("execl");
			exit(EXIT_FAILURE);
		}
		default:
			close(pipesLeitura[i][1]); // se o pai lê neste pipe, então não vai escrever neste pipe
			break;
		}
	}

	// Processamento de cada oc feito concorrentemente, leitura feita sequencialmente

	for (i = 0; i < numeroProgramas; i++) {
		int size = 100;
		char buf[size];
 		int nbytesRead = read(pipesLeitura[i][0], buf, size);


		if (nbytesRead > 0) {
			resultados[i] = atoi(buf);
		} else {
			if (nbytesRead == -1) {
				perror("read");
				exit(EXIT_FAILURE);
			}
			resultados[i] = -1;
		}
		printf("%s: %d ", argv[i + 2], resultados[i]);

	}
	printf("\n");

	return 0;
}
